package demo02;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class NewFileUploadServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8888)) {
            while (true) {
                Socket socket = serverSocket.accept();
                new Thread(() -> { // 创建新线程，每当有新客户发送数据，就创建一条新线程用于接收并上传数据，提高程序效率
                    File file = new File("file\\download");
                    if (!file.exists()) { // 文件夹如果不存在，则创建文件夹
                        file.mkdirs(); // 创建多级文件夹
                    }
                    try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( // 使用缓冲流输出，提高效率
                            new FileOutputStream(file + ("\\" + System.currentTimeMillis() + ".jpg")))) { // 文件名使用系统时间，保证不会重复
                        BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream()); // 输入流：接收客户端发送的信息，数据量大，通过缓冲流提高效率
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        while ((len = inputStream.read(bytes)) != -1) { // 接收数据
                            bufferedOutputStream.write(bytes, 0, len); // 存储数据到数据库（用文件夹模拟）
                        }
                        OutputStream outputStream = socket.getOutputStream(); // 输出流：向客户端回写信息
                        outputStream.write("图片上传成功！".getBytes()); // 回写数据
                        socket.shutdownOutput(); // 数据回写完毕后关闭输出流，同时能够将结束标记加进去
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
